package com.woniuxy.mypredicates;

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
* @Author: 马宇航
* @Todo: 自定义断言要使用的config,Price=0,1000;这个config就是用来封装后面的数据
* @DateTime:  22/10/13/0013 15:09
* @Component: 成都蜗牛学苑
**/
@Component
class Config{
    private double minValue;
    private double maxValue;

    public double getMinValue() {
        return minValue;
    }

    public void setMinValue(double minValue) {
        this.minValue = minValue;
    }

    public double getMaxValue() {
        return maxValue;
    }

    public void setMaxValue(double maxValue) {
        this.maxValue = maxValue;
    }
}

/**
 * @Author: 马宇航
 * @Description: 自定义断言，price=0,1000来对价格进行一个筛选
 * @DateTime: 22/10/13/0013 15:07
 * @Component: 成都蜗牛学苑
 **/
@Component
public class PriceRoutePredicateFactory extends AbstractRoutePredicateFactory<Config> {

    public PriceRoutePredicateFactory() {
        super(Config.class);
    }



    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return new GatewayPredicate(){
            /**
             * 这个方法，先要获取url后的传入的值。然后进行比较判断。
             * ChangeLog : 1. 创建 (22/10/13/0013 15:13 [马宇航]);
             * @param serverWebExchange
             * @return boolean
            */
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                ServerHttpRequest request = serverWebExchange.getRequest();
                System.out.println("获取到的url路径:"+request.getURI());
                //通过请求，获取请求中的参数的值
                String floorPrice = request.getQueryParams().get("floorPrice").get(0);
                String ceilingPrice = request.getQueryParams().get("ceilingPrice").get(0);
                if (config.getMinValue()<Double.parseDouble(floorPrice)
                        &&Double.parseDouble(ceilingPrice)< config.getMaxValue()){
                    return true;
                }
                return false;
            }
        };
    }
    /**
     * 排序:price=0,1000;这里指定一下，第一个参数就是minValue的值，第二个就是maxValue
     * ChangeLog : 1. 创建 (22/10/13/0013 15:19 [马宇航]);
     *
     * @return java.util.List<java.lang.String>
    */
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("minValue","maxValue");
    }
}
